import 'reflect-metadata'

/**
 * 返回一个类装饰器或方法装饰器
 * @param guards 可以接收一个或多个守卫 
 */
export function UseGuards(...guards) {
  /**
   * 如果是类装饰器则只有1个参数: 类本身
   * 如果是方法装饰器则拥有3个参数: 类的原型对象 被装饰的方法名 属性描述符
   */
  return (target: Object | Function, property?: String | Symbol, descriptor?: PropertyDescriptor) => {
    if (descriptor) { // 方法装饰器
      // 给方法添加一个 guards 元数据 值是守卫组成的数组
      Reflect.defineMetadata('guards', guards, descriptor.value)
    } else { // 类装饰器
      // 给类添加一个 guards 元数据 值是守卫组成的数组
      Reflect.defineMetadata('guards', guards, target)
    }
  }
}
